package cn.xuchunh.guava.base;

import com.google.common.base.Optional;

import java.util.Set;

/**
 * Created by XCH on 2017/3/27.
 * <a href='http://wiki.jikexueyuan.com/project/google-guava-official-tutorial/use-and-ignore-null.html'>使用和避免 null</a>
 * @author XCH
 * @version 1.0.0-SNAPSHOT
 */
public class EatNull {

    public static void main(String[] args) {
        String noNull = "I am not null";
        String justNull = null;

        // 创建指定引用的 Optional 实例，若引用为 null 则快速失败
        Optional<String> str1 = Optional.of(noNull);
        // 	如果 Optional 包含非 null 的引用（引用存在），返回true
        System.out.println(str1.isPresent());
        System.out.println(str1.get());

        try {
            Optional<String> str2 = Optional.of(justNull);
        } catch (Exception e) {
            System.out.println(e);
        }


        // 	创建引用缺失的 Optional 实例
        Optional<String> str3 = Optional.absent();
        // 	创建指定引用的 Optional 实例，若引用为 null 则表示缺失
        Optional<String> str4 = Optional.fromNullable(justNull);
        System.out.println(str4.isPresent());
        try {
            // 返回 Optional 所包含的引用，若引用缺失，则抛出 java.lang.IllegalStateException
            System.out.println(str3.get());
            System.out.println(str4.get());
        } catch (Exception e) {
            System.out.println(e);
        }

        // 	返回 Optional 所包含的引用，若引用缺失，返回指定的值
        System.out.println(str1.or("not null"));
        System.out.println(str3.or("just null"));

        // 	返回 Optional 所包含的引用，若引用缺失，返回 null
        System.out.println(str1.orNull());
        System.out.println(str3.orNull());

        // 	返回 Optional 所包含引用的单例不可变集，如果引用存在，返回一个只有单一元素的集合，如果引用缺失，返回一个空集合。
        Set<String> set1 = str1.asSet();
        System.out.println(set1);

        Set<String> set2 = str3.asSet();
        System.out.println(set2);

    }

}
